package com.powernode.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;

import java.time.Duration;

/**
 * 缓存配置类，不影响业务逻辑
 * Redis是一种key-value存储系统，可以存储一个key对应的value，value有丰富的数据类型，
 * 例如：String、Hash、List、Set、ZSet等等。Redis存储数据时需要先将数据转换为二进制数据后再进行存储。
 * 在实现数据序列化时，最常用的方法是JSON编码。
 * JSON是一种轻量级的数据交换格式，它具有结构简单、易于读写、易于解析等特点。
 * 而Redis提供的JSON序列化模块，则可以将Redis中的数据序列化为JSON字符串，并使用基于JSON的对象模型进行解码。
 */
@Configuration
public class RedisCacheConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        // 创建redis缓存配置类
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        // 进行redis配置
        redisCacheConfiguration =
                redisCacheConfiguration.
                        serializeValuesWith(
                                RedisSerializationContext.SerializationPair.fromSerializer(
                                        RedisSerializer.json()))    // 设置value序列化格式为json
                        .entryTtl(Duration.ofDays(7))   // 设置redis中值的默认过期时间(7天)
                        .disableCachingNullValues();  // redis的value值禁止使用空值
        return redisCacheConfiguration;
    }
}